home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 208_01 / e6.c < prev    next >
Text File  |  1987-10-11  |  5KB  |  272 lines

  1. /*
  2. HEADER:        CUG208;
  3. TITLE:        'e' for CP/M68K
  4. VERSION:    1.48+
  5.  
  6. DESCRIPTION:    "a screen editor";
  7.  
  8. KEYWORDS:    editor;
  9. SYSTEM:        CP/M68K, V1.2;
  10. FILENAME:    e/e6.c
  11. WARNINGS:    "the default value is for systems with 128K bytes
  12.          of memory or more";
  13. SEE-ALSO:    cpm68k.c, e68k.doc, CUG VOL 133;
  14. AUTHORS:    G.N.Gilbert('e'), J.W.Haefner(for DeSmet C on MSDOS and UNIX)
  15. CODER:        Yoshimasa Tsuji
  16. COMPILERS:    DRI C(Alcyon C) for CP/M68K;
  17. */
  18. /*
  19.     FUNCTIONS: blockpos,blockops,putpart,listfile
  20.     PURPOSE: performs block commands
  21. */
  22.  
  23. #include "e.h"
  24.  
  25.  
  26. blockpos(oldpos)
  27. int oldpos;
  28. {
  29.     int c;
  30.  
  31.     if (oldpos) putstr("| or |P|rev.");
  32.     do {
  33.         ptlineno(cline);
  34.         resetcursor();
  35.         c = getkey();
  36.         if(goabout(c) == -1)
  37.             switch (c) {
  38.             case 'p'    :
  39.             case 'P'    :
  40.                 if (oldpos) return PREV;
  41.                 break;
  42.             case ESCKEY    :
  43.                 return FAIL;
  44.             default        :
  45.                 ;
  46.             }
  47.  
  48.     }
  49.     while (c != CR);
  50.     return(cline);
  51. }
  52.  
  53. blockops()
  54. {
  55.     int oldcline, oldcharn, oldto, oldfrom, op;
  56.     int l, ll, line, shifts, shiftx, cp, y, c;
  57.  
  58.     char  *txt, shift[LLIM];
  59.  
  60.     puttext();
  61.     oldcline=cline;
  62.     oldcharn=charn;
  63.     oldfrom=from;
  64.     oldto=to;
  65.     putmess("W|rite to file, |P|rint, |S|hift, |M|ove, |C|opy, or |D|elete block ? ");
  66.     while (YES) {
  67.         switch ((op=getlow())) {
  68.         case ESCKEY :
  69.             return;
  70.         case 'w':
  71.             putstr("Write");
  72.             break;
  73.         case 'p':
  74.             putstr("Print");
  75.             break;
  76.         case 's':
  77.             putstr("Shift");
  78.             break;
  79.         case 'm':
  80.             putstr("Move");
  81.             break;
  82.         case 'c':
  83.             putstr("Copy");
  84.             break;
  85.         case 'd':
  86.             putstr("Delete");
  87.             break;
  88.         default:
  89.             continue;
  90.         }
  91.         break;
  92.     }
  93.     from=cline;
  94.     to=0;
  95.     blocking=YES;
  96.     putmess("|Put cursor on line |end|ing block and press [return]");
  97.     if ( (to=blockpos(oldto)) == FAIL) {
  98.         to=cline;
  99.         goto abort;
  100.     }
  101.     if (to == PREV) {
  102.         moveline(oldfrom-cline);
  103.         to=loc(oldto,0);
  104.         for (l=from=cline, y=cursory, ll= (oldto < plast ? oldto : plast);
  105.             l <= ll; l++, y++) putline(l,y);
  106.     }
  107.     if (to < from) {
  108.         l=to;
  109.         to=from;
  110.         from=l;
  111.     }
  112.     switch (op) {
  113.     case 'w':
  114.         putmess("File to write to? ");
  115.         if (scans(name,15) != ESCKEY)
  116.             if (exists(name)) writefile(from,to,name,name,NO);
  117.         break;
  118.     case 'p':
  119.         listfile(from,to);
  120.         break;
  121.     case 's':
  122.         putmess("Delete/insert spaces/tabs| to shift line, and press [return]");
  123.         moveline(from-cline);
  124.         sync(0);
  125.         resetcursor();
  126.         for (shifts=0; (c=getkey()) != CR; ) {
  127.             switch (c) {
  128.             case DELRIGHT:
  129.                 if (text[0] == ' ' || text[0] == '\t')
  130.                     deletechar(0);
  131.                 break;
  132.             case ' ':
  133.                 insertchar(' ');
  134.                 break;
  135.             case TAB:
  136.                 insertchar('\t');
  137.                 break;
  138.             case ESCKEY:
  139.                 goto abort;
  140.             default:
  141.                 continue;     /*ignore other characters*/
  142.             }
  143.             shift[shifts++]=c;
  144.             sync(0);
  145.             resetcursor();
  146.         }
  147.         puttext();
  148.         for (l=from+1; l <= to; l++) {
  149.             strcpy(text,getline(l));
  150.             cline= l;
  151.             for (shiftx=0; shiftx < shifts; shiftx++) {
  152.                 switch((c=shift[shiftx])) {
  153.                 case DELRIGHT:
  154.                     if (*(txt= &text[0]) == ' ' || *txt == '\t')
  155.                         while ( (*txt= *(txt+1))) txt++;
  156.                     break;
  157.                 case ' ':
  158.                 case TAB:
  159.                     if ((cp=strlen(text)) < (LLIM-1)) {
  160.                         for (; cp >= 0; cp--)
  161.                             text[cp+1]=text[cp];
  162.                         text[0]= (c == ' ' ? ' ':'\t');
  163.                     }
  164.                     break;
  165.                 }
  166.             }
  167.             altered=YES;
  168.             puttext();
  169.         }
  170.         break;
  171.     case 'd':
  172.         for (l=from; l <= to; l++) delete(from);
  173.         cline= loc(from,0);
  174.         strcpy(text,getline(cline));
  175.         adjustc(cursorx);
  176.         from=to=0;
  177.         break;
  178.     case 'm':
  179.     case 'c':
  180.         putmess("|Put cursor on |line under which  block is to go |and press [return]");
  181.         if ( (cline=line=blockpos(0)) == FAIL) {
  182.             cline=oldcline;
  183.             break;
  184.         }
  185.         for (l=from; l <= to; l++) {
  186.             if ((line=inject(line,getline(l))) == FAIL) break;
  187.             if (op == 'm') {
  188.                 delete( (l<line?l:l+1) );
  189.                 if (to < line) {
  190.                     to--;
  191.                     l--;
  192.                     line--;
  193.                     cline--;
  194.                 }
  195.             }
  196.             else {
  197.                 if (to >= line) to++;
  198.                 if (l >= line) l++;
  199.                 if (l == cline) l=line;
  200.             }
  201.         }
  202.         from=cline+1;
  203.         to=line;
  204.         break;
  205.     }
  206. abort:
  207.     blocking=NO;
  208.     switch (op) {
  209.     case 'w':
  210.     case 'p':
  211.     case 's':
  212.         cline=oldcline;
  213.         charn=oldcharn;
  214.         putpart(from,to);
  215.         break;
  216.     case 'd':
  217.         putpart(cline,cline+SHEIGHT);
  218.         break;
  219.     case 'm':
  220.     case 'c':
  221.         putpage();
  222.         break;
  223.     }
  224. }
  225.  
  226. putpart(start,fin)
  227. int start,fin;
  228. {
  229.     int l, y;
  230.  
  231.     if (start < pfirst) putpage();
  232.     else
  233.         for (l=start, y=topline+(start-pfirst); l <= fin && y <= SHEIGHT;
  234.             l++, y++) {
  235.                 if (l == cline) cursory=y;
  236.             putline(l,y);
  237.         }
  238.     strcpy(text,getline(cline));
  239. }
  240.  
  241. listfile(ffrom,tto)
  242. int ffrom,tto;
  243. {
  244.     int l,cp,i;
  245.     char *t, ch[2];
  246.     int lst;
  247.  
  248.     puttext();
  249.     lst= open("LST:", 1);
  250.  
  251.     for (l=ffrom; l<=tto; l++) {
  252.         if (l%10 == 0) ptlineno(l);
  253.         for (cp=0, t=getline(l); *t; t++)
  254.             if (*t == '\t') for (i=tabwidth-cp%tabwidth; i>0 ; cp++, i--)
  255.                 write(lst, " ", 1);
  256.             else {
  257.                 if (*t > CTRL) write(lst, t, 1);
  258.                 else {
  259.                     write(lst, "^", 1);
  260.                     ch[0] = *t+64, write(lst, ch, 1);
  261.                 }
  262.                 cp++;
  263.             }
  264.         write(lst, "\n", 1);
  265.         if (testkey() == ESCKEY) {
  266.             error("Listing aborted");
  267.             return;
  268.         }
  269.     }
  270.     close(lst);
  271. }
  272.